#pragma once

#include<string.h>
#include<iostream>
#include<sys/types.h>
#include<sys/wait.h>
#include<pthread.h>
#include<unistd.h>
#include"thread_pool.hpp"

namespace Han
{
  void HelpHander(int sock)
  {
    while(true)
    {

      //回调函数，执行数据处理
      char message[1024];
      memset(message,0,sizeof(message));
      int s=read(sock,message,sizeof(message));
      if(s>0)
      {
        message[s]=0;
        //处理数据
        std::cout<<"client send # "<<message<<std::endl;
       // write(sock,message,strlen(message));
        
      }
      else{
        //1 客户端关闭 s==0
        //2 读取失败  s<o
        return ;
      }
    }
  }

  void hander1(int sock)
  {
    HelpHander(sock);
  }
  void hander2(int sock)
  {
    //用多进程的方式实现
    if(fork()==0)
    {
      //child
      if(fork()==0)
      {
        //child-child
        HelpHander(sock);
        exit(0);
       }
      exit(0);   //让child 退出  让child-child成为孤儿进程，被系统领养管理
    }
    //wait()  // 为不让主进程等待，让其孤儿进程
    wait(nullptr);
  }

  void* Routine(void* s)
  {
    //不让主线程等待，分离并发执行
    pthread_detach(pthread_self());
    int* sc=(int*)s;
    int sock=*sc;
    std::cout<<"debug "<<sock<<std::endl;
    delete sc;
    //处理数据
    HelpHander(sock);
    //处理完毕,关闭文件描述符
    close(sock);
    return nullptr;
  }
  void hander3(int sock)
  {
    //用多线程实现
    pthread_t p;
    int* sk=new int(sock);
    int m=pthread_create(&p,nullptr,Routine,(void*)sk);
    if(m<0)
    {
      std::cerr<<"pthread_create error"<<std::endl;
      return;
    }
  }

  class Task
  {
    private:
      int sock;
    public:
      Task()
      {}
      Task(int _sock):sock(_sock)
      {}
      ~Task()
      {}
      void operator()()
      {
        HelpHander(sock);
        close(sock);
      }
  };
  void hander4(int sock)
  {
    //用线程池实现
    ThreadPool<Task>* p=ThreadPool<Task>::get_instance(5);
    p->PushTask(Task(sock));
  }
}
